package org.TCC_NOVO.client.visual;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormHandler;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormSubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormSubmitEvent;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Function;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Tool;
import com.gwtext.client.widgets.Toolbar;
import com.gwtext.client.widgets.ToolbarButton;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
import java.util.ArrayList;
import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.modelo.OcorrenciaUnidade;
import org.TCC_NOVO.client.modelo.Unidade;

public class ValidarUnidadePanel extends Panel{
    private final GWTServiceAsync controller;

    ValidarUnidadePanel self;
    int IDF_Usuario = 0;

    FormPanel form;
    FileUpload upload;
    TextArea arquivo;

    //Master
    Store storeMaster;
    GridPanel gridMaster;
    RecordDef recordDefMaster;

    //Detail
    Store storeDetalhe;
    GridPanel gridDetalhe;
    RecordDef recordDefDetalhe;
    
    Toolbar toolbar;
    ArrayList<Unidade> ArrayUnidade = new ArrayList();
    ArrayList<OcorrenciaUnidade> ArrayOcorUnidade = new ArrayList();

    public ValidarUnidadePanel(GWTServiceAsync controller, int idf_Usua) {
        this.controller = controller;
        this.IDF_Usuario = idf_Usua;
        this.self = this;
        this.init();
    }

    private void init(){
        this.setBorder(true);
        this.setPaddings(2);
        
        recordDefMaster = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new IntegerFieldDef("IDF_Projeto"),
            new StringFieldDef("nomeProjeto"),
            new StringFieldDef("nomeUnidade"),
            new StringFieldDef("status"),
            new StringFieldDef("descricaoUnidade"),
            new StringFieldDef("duracao"),                        
        });

        storeMaster = new Store(recordDefMaster);
        gridMaster = new GridPanel();
        gridMaster.setStore(storeMaster);

        ColumnConfig[] columns = new ColumnConfig[]{
            new ColumnConfig("Nome Projeto", "nomeProjeto", 190, true),
            new ColumnConfig("Nome Unidade", "nomeUnidade", 270, true),
            new ColumnConfig("Status", "status", 130, true),
            new ColumnConfig("Descrição", "descricaoUnidade", 190, true),
            new ColumnConfig("Duração", "duracao", 120, true),
        };

        ColumnModel columnModel = new ColumnModel(columns);
        gridMaster.setColumnModel(columnModel);
        gridMaster.setFrame(true);
        gridMaster.setStripeRows(true);
        gridMaster.setSize(1020, 280);
        gridMaster.setTitle("Unidades");
        gridMaster.addTool(new Tool(Tool.REFRESH, new Function() {
            @Override
            public void execute() {
                gridMaster.getEl().mask("Carregando", "x-mask-loading");
                CarregarGrid();
                CarrgarGridDetalhe();
                Timer timer = new Timer() {
                    @Override
                    public void run() {
                        gridMaster.getEl().unmask();
                    }
                };
                timer.schedule(1000);
            }
        }, "Atualizar"));

        gridMaster.addGridCellListener(new GridCellListenerAdapter(){
            @Override
            public void onCellClick(GridPanel grid, int rowIndex, int colIndex, EventObject e){
                storeDetalhe.filter("IDF_Unidade", grid.getSelectionModel().getSelected().getAsString("ID"));
            }
        });
        
        //Detalhes
        recordDefDetalhe = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new IntegerFieldDef("IDF_Unidade"),
            new StringFieldDef("data"),
            new StringFieldDef("usuario"),
            new StringFieldDef("descricao"),
            new StringFieldDef("observacao"),
        });

        storeDetalhe = new Store(recordDefDetalhe);
        gridDetalhe = new GridPanel();
        gridDetalhe.setStore(storeDetalhe);

        ColumnConfig[] columnsDetalhe = new ColumnConfig[]{
            new ColumnConfig("Data Ocorrência", "data", 120, true),
            new ColumnConfig("Usuário", "usuario", 130, true),
            new ColumnConfig("Descrição", "descricao", 250, true),
            new ColumnConfig("Observação", "observacao", 340, true),
        };

        ColumnModel columnModelDetalhe = new ColumnModel(columnsDetalhe);
        gridDetalhe.setColumnModel(columnModelDetalhe);
        gridDetalhe.setFrame(true);
        gridDetalhe.setTitle("Ocorrências Unidade");
        gridDetalhe.setStripeRows(true);
        gridDetalhe.setSize(1020, 300);
        gridDetalhe.setAutoScroll(true);

        toolbar = getToolbar();
        toolbar.setSize(gridMaster.getWidth(), 30);
        this.add(toolbar);
        this.add(gridMaster);
        this.add(gridDetalhe);

        CarregarGrid();
        CarrgarGridDetalhe();
    }

    public void CarregarGrid(){
        storeMaster.removeAll();
        String sSQL = "select A.ID, A.Nome, A.Descricao, A.IDF_Projeto, "+
                       "A.Status, A.Duracao, B.Nome NomeProj, A.Nome_Arquivo, A.Arquivo_Raiz "+
                       "from Unidade A "+
                       "inner join Projeto B on B.ID = A.IDF_Projeto "+
                       "where A.Status = 'Pronta para Revisão' and B.IDF_Conteudista = "+IDF_Usuario;
        controller.RetornarDadosUnidade(sSQL, new CallBackRetUnidade());
    }

    private class CallBackRetUnidade implements AsyncCallback<ArrayList<Unidade>> {
        @Override
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
        @Override
	public void onSuccess(ArrayList<Unidade> result) {
                CarregarDados(result);
        }
     }

    private void CarregarDados(ArrayList<Unidade> result){
        ArrayUnidade = result;
        for (int i = 0; i < result.size(); ++i) {
            addRecord(result.get(i));
        }
    }

    public void addRecord(Unidade Unid){
        Object[] rowData = new Object[]{
          Unid.getId(),
          Unid.getIdf_projeto(),
          Unid.getNmProjeto(),
          Unid.getNome(),
          Unid.getStatus(),
          Unid.getDescricao(),
          Unid.getDuracao(),
        };
        Record record = recordDefMaster.createRecord(rowData[0].toString(), rowData);
        storeMaster.add(record);
    }
    
    private class CallBackRetOcoUnidade implements AsyncCallback<ArrayList<OcorrenciaUnidade>> {
        @Override
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
        @Override
	public void onSuccess(ArrayList<OcorrenciaUnidade> result) {
                CarregarDadosDetalhe(result);
                storeDetalhe.filter("IDF_Unidade", "VAZIO");
        }
    }

    private void CarregarDadosDetalhe(ArrayList<OcorrenciaUnidade> result){
        ArrayOcorUnidade = result;
        for (int i = 0; i < result.size(); ++i) {
            addRecordDetalhe(result.get(i));
        }
    }

    public void addRecordDetalhe(OcorrenciaUnidade OcoUnidade){
        Object[] rowData = new Object[]{
          OcoUnidade.getID(),
          OcoUnidade.getIDF_Unidade(),
          OcoUnidade.getData(),
          OcoUnidade.getUsuario(),
          OcoUnidade.getDescricao(),
          OcoUnidade.getObservacao(),
        };
        Record record = recordDefDetalhe.createRecord(rowData[0].toString(), rowData);
        storeDetalhe.add(record);
    }

    public void CarrgarGridDetalhe(){
        storeDetalhe.removeAll();
        String sSQL = "select * from ocorrencia_Unidade A "+
                      "inner join Usuario B on B.ID = A.IDF_Usuario";
        controller.RetornarDadosOcoUnidade(sSQL, new CallBackRetOcoUnidade());
    }

    public Toolbar getToolbar(){

        ToolbarButton btnBaixarArq = new ToolbarButton();
        btnBaixarArq.setText(" Baixar Arquivo Unidade");
        btnBaixarArq.setIcon("Images/download.png");
        btnBaixarArq.setTooltip("Permite Baixar o Arquivo da Unidade Selecionada");
        btnBaixarArq.addListener(new ButtonListenerAdapter(){
            @Override
            public void onClick(Button button, EventObject e){
                if (gridMaster.getSelectionModel().getSelected() == null){
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                }else{
                    //arquivo.setValue(gridMaster.getSelectionModel().getSelected().getAsString("ID"));
                    upload.setName("Unidades"+","+gridMaster.getSelectionModel().getSelected().getAsString("ID"));
                    form.submit();
                }
            }
        });

        form = new FormPanel();
        form.setAction("ServletDownload");
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setMethod(FormPanel.METHOD_POST);

        VerticalPanel panel = new VerticalPanel();
        form.setWidget(panel);
        upload = new FileUpload();
        panel.add(upload);

        //Adiciona o evento no form.
        form.addFormHandler(new FormHandler() {
            @Override
            public void onSubmitComplete(FormSubmitCompleteEvent event) {
                System.out.println(event.getResults());
            }
            @Override
            public void onSubmit(FormSubmitEvent event) {
                //System.out.println(event.getResults());
                //wainting.show();
                //wainting.Executar();
            }
        });

        ToolbarButton btnTramiteUnid = new ToolbarButton();
        btnTramiteUnid.setText(" Trâmite Unidade");
        btnTramiteUnid.setIcon("Images/tarefaStatus.png");
        btnTramiteUnid.setTooltip("Permite Informar se os objetivos da unidade foram atendidos ou não");
        btnTramiteUnid.addListener(new ButtonListenerAdapter(){
            @Override
            public void onClick(Button button, EventObject e){
                if (gridMaster.getSelectionModel().getSelected() == null){
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                }else{
                    ValidarUnidadeForm valUniForm = new ValidarUnidadeForm(controller,
                                                                           self,
                                                                           gridMaster.getSelectionModel().getSelected().getAsInteger("ID"),
                                                                           IDF_Usuario);
                    valUniForm.show();
                }
            }
        });
        
        Toolbar toobar = new Toolbar();
        toobar.addButton(btnBaixarArq);
        toobar.addButton(btnTramiteUnid);

        
        return toobar;
    }

}
